﻿using Hjt212Parser;
using HpSocketIotGateway.Db.Code1st;
using log4net;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using ToolsAndHjt212Parser;

namespace HpSocketIotGateway.Facade
{
    /// <summary>
    /// 连接合法性认证
    /// </summary>
    public class Authorization
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(Authorization));
        private static readonly ConcurrentDictionary<IntPtr, int> NoMnTimes = new ConcurrentDictionary<IntPtr, int>();
        //public static void CountNoMnTime(IntPtr connId)
        //{
        //    try
        //    {
        //        if (!NoMnTimes.ContainsKey(connId))
        //        {
        //            NoMnTimes.TryAdd(connId, 1);
        //        }
        //        else
        //        {
        //            NoMnTimes.TryGetValue(connId, out var oldMn);
        //            NoMnTimes.TryRemove(connId, out oldMn);
        //            NoMnTimes.TryAdd(connId, ++oldMn);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Log.Error(ex);
        //    }
        //}
        //public static void SetNoMnTimeZero(IntPtr connId)
        //{
        //    try
        //    {
        //        if (NoMnTimes.ContainsKey(connId))
        //        {
        //            NoMnTimes.TryGetValue(connId, out _);
        //            NoMnTimes.TryRemove(connId, out _);
        //            NoMnTimes.TryAdd(connId, 0);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Log.Error(ex);
        //    }
        //}
        //public static void Remove(IntPtr connId)
        //{
        //    try
        //    {
        //        if (NoMnTimes.ContainsKey(connId))
        //        {
        //            NoMnTimes.TryRemove(connId, out _);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Log.Error(ex);
        //    }
        //}
        //public static int GetNoMnTime(IntPtr connId)
        //{
        //    try
        //    {
        //        if (NoMnTimes.ContainsKey(connId))
        //        {
        //            NoMnTimes.TryGetValue(connId, out var oldMn);
        //            NoMnTimes.TryRemove(connId, out oldMn);
        //            return oldMn;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Log.Error(ex);
        //    }
        //    return -1;
        //}
        private static List<controller> _controllers;
        public static bool IsMnProhibited(string mn)
        {
            try
            {
                if (_controllers == null || MyTimer.IsToTheTime("Authorization.IsMnProhibited", 10))
                {
                    using (var ctx = new GatewayContext())
                    {
                        _controllers = ctx.controllers.AsNoTracking().ToList();
                    }
                }

                var c = _controllers.FirstOrDefault(t => t.mn.Equals(mn));

                if (c == null)
                {
                    using (var ctx = new GatewayContext())
                    {
                        _controllers = ctx.controllers.AsNoTracking().ToList();
                        c = _controllers.FirstOrDefault(t => t.mn.Equals(mn));
                        if (c == null&& MyValidation.IsMnValid(mn))
                        {
                            c = new controller {mn = mn, feature = Authentication.allow.ToString()};
                            ctx.controllers.Add(c);
                            ctx.SaveChanges();
                        }
                        _controllers = ctx.controllers.AsNoTracking().ToList();
                    }
                }

                c = _controllers.FirstOrDefault(t => t.mn != null && t.mn.Equals(mn) && t.feature != null && !t.feature.Contains("allow"));
                if (c != null)
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
            return false;
        }
    }
}
